home *** CD-ROM | disk | FTP | other *** search
/ Delphi 5 for Professionals / DELPHI5.iso / AddOns / Components / TEECHART / Src Code / OHLCHART.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-10-24  |  6.2 KB  |  197 lines

  1. {**********************************************}
  2. {   TOHLCSeries (derived from TCustomSeries)   }
  3. {   Copyright (c) 1995-1996 by David Berneda   }
  4. {**********************************************}
  5. unit OHLChart;
  6.  
  7. interface
  8.  
  9. Uses Classes,Graphics,Chart,Series,Teengine;
  10.  
  11. { This Unit shows an example of a derived Chart Series.
  12.   Used in financial applications, OHLC stands for Open,High,Low & Close.
  13.   These are the prices a particular financial product has in a given time
  14.   period.
  15.  
  16.   TOHLCSeries extends the basic TCustomSeries adding new lists for
  17.   High, Low & Close prices, and preserving the default Y values for Open
  18.   prices.
  19.  
  20.   Overrides the basic list functions (Add, Clear & Delete) plus the
  21.   FillSampleValues method, used in design mode to show some fictional
  22.   values to the user.
  23.  
  24.   Publishes the High,Low & Close values lists and "overrides" the XValues
  25.   property to be DateValues and the YValues to be OpenValues.
  26. }
  27. Type TOHLCSeries=class(TCustomSeries)
  28.      private { assumed YValues = OpenValues }
  29.        FHighValues  : TChartValueList;
  30.        FLowValues   : TChartValueList;
  31.        FCloseValues : TChartValueList;
  32.      protected
  33.        Function GetDateValues:TChartValueList;
  34.        Procedure SetDateValues(Value:TChartValueList);
  35.  
  36.        Function GetOpenValues:TChartValueList;
  37.        Procedure SetOpenValues(Value:TChartValueList);
  38.        Procedure SetHighValues(Value:TChartValueList);
  39.        Procedure SetLowValues(Value:TChartValueList);
  40.        Procedure SetCloseValues(Value:TChartValueList);
  41.      public
  42.        Constructor Create(AOwner: TComponent); override;
  43.        Function AddOHLC( Const ADate:TDateTime;
  44.                          Const AOpen,AHigh,ALow,AClose:Double):Longint;
  45.        Procedure GetRandomOHLC(Var AOpen,AClose,AHigh,ALow:Double; YRange:Double);
  46.        Procedure FillSampleValues(NumValues:Longint); override;
  47.        Function IsValidSourceOf(Value:TChartSeries):Boolean; override;
  48.        Function MaxYValue:Double; override;
  49.        Function MinYValue:Double; override;
  50.        Function NumSampleValues:Longint; override;
  51.      published
  52.        property CloseValues:TChartValueList read FCloseValues write SetCloseValues;
  53.        property DateValues:TChartValueList read GetDateValues write SetDateValues;
  54.        property HighValues:TChartValueList read FHighValues write SetHighValues;
  55.        property LowValues:TChartValueList read FLowValues write SetLowValues;
  56.        property OpenValues:TChartValueList read GetOpenValues write SetOpenValues;
  57.      end;
  58.  
  59. implementation
  60.  
  61. Uses SysUtils, TeCanvas ,TeeProco;
  62.  
  63. Constructor TOHLCSeries.Create(AOwner: TComponent);
  64. Begin
  65.   inherited Create(AOwner);
  66.   XValues.DateTime:=True;
  67.   XValues.Name:=TeeMsg_ValuesDate;
  68.   YValues.Name:=TeeMsg_ValuesOpen;
  69.   FHighValues :=TChartValueList.Create(Self,TeeMsg_ValuesHigh);
  70.   FLowValues  :=TChartValueList.Create(Self,TeeMsg_ValuesLow);
  71.   FCloseValues:=TChartValueList.Create(Self,TeeMsg_ValuesClose);
  72.   {$IFDEF TEETRIAL}
  73.   TeeTrial(ComponentState);
  74.   {$ENDIF}
  75. end;
  76.  
  77. Function TOHLCSeries.GetDateValues:TChartValueList;
  78. Begin
  79.   result:=XValues; { overrides the default XValues }
  80. end;
  81.  
  82. Procedure TOHLCSeries.SetDateValues(Value:TChartValueList);
  83. begin
  84.   SetXValues(Value); { overrides the default XValues }
  85. end;
  86.  
  87. Function TOHLCSeries.GetOpenValues:TChartValueList;
  88. Begin
  89.   result:=YValues; { overrides the default YValues }
  90. end;
  91.  
  92. Procedure TOHLCSeries.SetOpenValues(Value:TChartValueList);
  93. begin
  94.   SetYValues(Value); { overrides the default YValues }
  95. end;
  96.  
  97. Procedure TOHLCSeries.SetHighValues(Value:TChartValueList);
  98. Begin
  99.   SetChartValueList(FHighValues,Value); { standard method }
  100. end;
  101.  
  102. Procedure TOHLCSeries.SetLowValues(Value:TChartValueList);
  103. Begin
  104.   SetChartValueList(FLowValues,Value); { standard method }
  105. end;
  106.  
  107. Procedure TOHLCSeries.SetCloseValues(Value:TChartValueList);
  108. Begin
  109.   SetChartValueList(FCloseValues,Value); { standard method }
  110. end;
  111.  
  112. Function TOHLCSeries.AddOHLC( Const ADate:TDateTime;
  113.                              Const AOpen,AHigh,ALow,AClose:Double):Longint;
  114. Begin
  115.   FHighValues.TempValue:=AHigh;
  116.   FLowValues.TempValue:=ALow;
  117.   FCloseValues.TempValue:=AClose;
  118.   result:=AddXY(ADate,AOpen{$IFNDEF D4},'', clTeeColor{$ENDIF}); { standard add X,Y }
  119.   AddValue(result);
  120. end;
  121.  
  122. Function TOHLCSeries.MaxYValue:Double;
  123. Begin
  124.   result:=inherited MaxYValue;
  125.   result:=MaxDouble(result,FHighValues.MaxValue);
  126.   result:=MaxDouble(result,FLowValues.MaxValue);
  127.   result:=MaxDouble(result,FCloseValues.MaxValue);
  128. End;
  129.  
  130. Function TOHLCSeries.MinYValue:Double;
  131. Begin
  132.   result:=inherited MinYValue;
  133.   result:=MinDouble(result,FHighValues.MinValue);
  134.   result:=MinDouble(result,FLowValues.MinValue);
  135.   result:=MinDouble(result,FCloseValues.MinValue);
  136. End;
  137.  
  138. Procedure TOHLCSeries.GetRandomOHLC(Var AOpen,AClose,AHigh,ALow:Double; YRange:Double);
  139. var tmpY     : Longint;
  140.     tmpFixed : Double;
  141. Begin
  142.   tmpY:=Abs(Round(YRange/400.0));
  143.   AClose:=AOpen+Random(Round(YRange/25.0))-(YRange/50.0); { imagine a close price... }
  144.   { and imagine the high and low session price }
  145.   tmpFixed:=3*Round(Abs(AClose-AOpen)/10.0);
  146.   if AClose>AOpen then
  147.   Begin
  148.     AHigh:=AClose+tmpFixed+Random(tmpY);
  149.     ALow:=AOpen-tmpFixed-Random(tmpY);
  150.   end
  151.   else
  152.   begin
  153.     AHigh:=AOpen+tmpFixed+Random(tmpY);
  154.     ALow:=AClose-tmpFixed-Random(tmpY);
  155.   end;
  156. end;
  157.  
  158. Procedure TOHLCSeries.FillSampleValues(NumValues:Longint);
  159. Var t      : Longint;
  160.     tmpX,
  161.     StepX,
  162.     tmpY,
  163.     MinY,
  164.     DifY   : Double;
  165.     AOpen,
  166.     AHigh,
  167.     ALow,
  168.     AClose : Double;
  169. Begin
  170.   Clear;
  171.   CalcRandomBounds(NumValues,tmpX,StepX,tmpY,MinY,DifY);
  172.   AOpen:=MinY+Random(Round(DifY)); { starting open price }
  173.   for t:=1 to NumValues do
  174.   Begin
  175.     { Generate random figures }
  176.     GetRandomOHLC(AOpen,AClose,AHigh,ALow,DifY);
  177.     { call the standard add method }
  178.     AddOHLC(tmpX,AOpen,AHigh,ALow,AClose);
  179.     tmpX:=tmpX+StepX;  { <-- next point X value }
  180.     { tomorrow, the market will open at today's close plus/minus something }
  181.     AOpen:=AClose+Random(10)-5;
  182.   end;
  183.   RefreshSeries;
  184. end;
  185.  
  186. Function TOHLCSeries.NumSampleValues:Longint;
  187. begin
  188.   result:=40;
  189. end;
  190.  
  191. Function TOHLCSeries.IsValidSourceOf(Value:TChartSeries):Boolean;
  192. begin
  193.   result:=Value is TOHLCSeries;
  194. end;
  195.  
  196. end.
  197.